#ifndef __PC_ARITHMETIC_OPERATION_H
#define __PC_ARITHMETIC_OPERATION_H

#include "wtype.h"

bool arith_op_divs64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_comp32(Reg64 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_abs64(Reg64 *dst, Reg64 *opt1);
bool arith_op_signed(Reg32 *dst, Reg32 *opt1);
bool arith_op_xor(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_and64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_or64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_xor64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_min64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_max64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_bit_clr(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_loop_sr32(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_loop_sr16(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_loop_sr8(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_loop_sl32(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_loop_sl16(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_loop_sl8(Reg128 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_rd8(Reg32 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_rd16l(Reg32 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_rd16h(Reg32 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_rd32(Reg32 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_rd64(Reg64 *dst, Reg128 *opt1, Reg32 *opt2);
bool arith_op_sl64(Reg64 *dst, Reg64 *opt1, Reg32 *opt2);
bool arith_op_srs64(Reg64 *dst, Reg64 *opt1, Reg32 *opt2);
bool arith_op_sl32(Reg64 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fabs(Reg32 *dst, Reg32 *opt1);
bool arith_op_fmin(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fmax(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_f32toi64(Reg64 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_i8tof32(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fmuladd(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fmulsub(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fmul(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fadd(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fsub(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_flog2(Reg32 *dst, Reg32 *opt1);
bool arith_op_exp2_frac32(Reg32 *dst, Reg32 *opt1);
bool arith_op_atk_rls(Reg32 *dst, Reg32 *opt1, Reg32 *opt2, S32 reg_r38);
bool arith_op_muls64_64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_mulc_32o(Reg64 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_mulc32_16(Reg64 *dst, Reg64 *opt1, Reg32 *opt2);
bool arith_op_mulc32_32(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_conj32(Reg64 *dst, Reg64 *opt1);
bool arith_op_add_c32(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_sub_c32(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_fmulc_conj(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_rpc16(Reg32 *dst, Reg64 *opt1, Reg32 *opt2);
bool arith_op_cvt32_16(Reg32 *dst, Reg32 *opt1);
bool arith_op_frelu(Reg32 *dst, Reg32 *opt1);
bool arith_op_fleaky(Reg32 *dst, Reg32 *opt1);
bool arith_op_fsl(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fdiv(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fsqrt(Reg32 *dst, Reg32 *opt1);
bool arith_op_comp16(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);

bool arith_op_slc(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_src(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_conj(Reg32 *dst, Reg32 *opt1);
bool arith_op_add_c(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_sub_c(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fadd_c(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_fsub_c(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_fconj(Reg64 *dst, Reg64 *opt1);
bool arith_op_add(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_sub(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_add64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_sub64(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_fneg(Reg32 *dst, Reg32 *opt1);
bool arith_op_abs(Reg32 *dst, Reg32 *opt1);
bool arith_op_and(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_or(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_cvt32_64(Reg64 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_min(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_max(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_bit_set(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_sl(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_srs(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_slp(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_sru(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_divs32f(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_divs32(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_divs64_32(Reg64 *dst, Reg64 *opt1, Reg32 *opt2);
bool arith_op_sin(Reg32 *dst, Reg32 *opt1);
bool arith_op_fsin(Reg32 *dst, Reg32 *opt1);
bool arith_op_cos(Reg32 *dst, Reg32 *opt1);
bool arith_op_fcos(Reg32 *dst, Reg32 *opt1);
bool arith_op_log2_m16p16(Reg32 *dst, Reg32 *opt1);
bool arith_op_log2_frac32(Reg32 *dst, Reg32 *opt1);
bool arith_op_exp2_m16p16(Reg32 *dst, Reg32 *opt1);
bool arith_op_sqrt(Reg32 *dst, Reg32 *opt1);
bool arith_op_sqrtf(Reg32 *dst, Reg32 *opt1);
bool arith_op_muls16(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_muls16f(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_muls32(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_muls32f(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_muls32_64(Reg64 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_muls64_32(Reg64 *dst, Reg64 *opt1, Reg32 *opt2);
bool arith_op_muls64_32f(Reg64 *dst, Reg64 *opt1, Reg32 *opt2);
bool arith_op_mulc(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_fmulc(Reg64 *dst, Reg64 *opt1, Reg64 *opt2);
bool arith_op_cvt64_32(Reg32 *dst, Reg64 *opt1);
bool arith_op_i32tof32(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_f32toi32(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_leaky(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_linear(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);
bool arith_op_relu(Reg32 *dst, Reg32 *opt1, Reg32 *opt2);

#endif // ! __PC_ARITHMETIC_OPERATION_H
